其他
一文全览机器学习建模流程(Python 代码)
The following article is from 算法进阶 Author 泳鱼
随着人工智能时代的到来,机器学习已成为解决问题的关键工具,如识别交易是否欺诈、预测降雨量、新闻分类、产品营销推荐。我们接下来会详细介绍机器学习如何应用到实际问题,并概括机器学习应用的一般流程。
1.1 明确问题
1.2 数据选择
① 数据的代表性:数据质量差或无代表性,会导致模型拟合效果差;
② 数据时间范围:对于监督学习的特征变量X及标签Y,如与时间先后有关,则需要划定好数据时间窗口,否则可能会导致数据泄漏,即存在和利用因果颠倒的特征变量的现象。(如预测明天会不会下雨,但是训练数据引入明天温湿度情况);
③ 数据业务范围:明确与任务相关的数据表范围,避免缺失代表性数据或引入大量无关数据作为噪音。
2 特征工程
① 探索性数据分析:数据分布、缺失、异常及相关性等情况;
② 数据预处理:缺失值/异常值处理,数据离散化,数据标准化等;
③ 特征提取:特征表示,特征衍生,特征选择,特征降维等;
2.1 探索性数据分析
2.2 数据预处理
异常值处理
缺失值处理
① 缺失率较高,并结合业务可以直接删除该特征变量。经验上可以新增一个bool类型的变量特征记录该字段的缺失情况,缺失记为1,非缺失记为0;
② 缺失率较低,结合业务可使用一些缺失值填充手段,如pandas的fillna方法、训练回归模型预测缺失值并填充;
③ 不做处理:部分模型如随机森林、xgboost、lightgbm能够处理数据缺失的情况,不需要对缺失数据再做处理。
数据离散化
数据标准化
① min-max 标准化:可将数值范围缩放到(0, 1)且无改变数据分布。max为样本最大值,min为样本最小值。
2.3 特征提取
特征表示
特征衍生
特征选择
① 过滤法:计算特征的缺失情况、发散性、相关性、信息量、稳定性等类型的指标对各个特征进行评估选择,常用如缺失率、单值率、方差验证、pearson相关系数、chi2卡方检验、IV值、信息增益及PSI等方法。
② 包装法:通过每次选择部分特征迭代训练模型,根据模型预测效果评分选择特征的去留,如sklearn的RFE递归特征消除。
③ 嵌入法:直接使用某些模型训练的到特征重要性,在模型训练同时进行特征选择。通过模型得到各个特征的权值系数,根据权值系数从大到小来选择特征。常用如基于L1正则项的逻辑回归、XGBOOST特征重要性选择特征。
特征降维
3 模型训练
3.1 数据集划分
② 开发验证集(development set)用于调整超参数、选择特征等,以选择合适模型。
③ 测试集(test set)只用于评估已选择模型的性能,但不会据此改变学习算法或参数。
3.2 模型方法选择
3.3 训练过程
4 模型评估
4.1 评估指标
评估分类模型
评估回归模型
评估聚类模型
4.2 模型评估及优化
5 模型决策
6 机器学习项目实战(数据挖掘)
6.1 项目介绍
6.2 代码实现
导入相关的Python库,加载cancer数据集,查看数据介绍, 并转为DataFrame格式。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.utils import plot_model
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import precision_score, recall_score, f1_score
dataset_cancer = datasets.load_breast_cancer() # 加载癌细胞数据集
print(dataset_cancer['DESCR'])
df = pd.DataFrame(dataset_cancer.data, columns=dataset_cancer.feature_names)
df['label'] = dataset_cancer.target
print(df.shape)
df.head()
import pandas_profiling
pandas_profiling.ProfileReport(df, title='Breast Cancer DataSet EDA')
# 筛选相关性>0.99的特征清单列表及标签
drop_feas = ['label','worst_radius','mean_radius']
# 选择标签y及特征x
y = df.label
x = df.drop(drop_feas,axis=1) # 删除相关性强特征及标签列
# holdout验证法: 按3:7划分测试集 训练集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
# 特征z-score 标准化
sc = StandardScaler()
x_train = sc.fit_transform(x_train) # 注:训练集测试集要分别标准化,以免测试集信息泄露到模型训练
x_test = sc.transform(x_test)
_dim = x_train.shape[1] # 输入模型的特征数
# LR逻辑回归模型
model = Sequential()
model.add(Dense(1, input_dim=_dim, activation='sigmoid',bias_initializer='uniform')) # 添加网络层,激活函数sigmoid
model.summary()
plot_model(model,show_shapes=True)
model.compile(optimizer='adam', loss='binary_crossentropy') #模型编译:选择交叉熵损失函数及adam梯度下降法优化算法
model.fit(x, y, validation_split=0.3, epochs=200) # 模型迭代训练: validation_split比例0.3, 迭代epochs200次
# 模型训练集及验证集的损失
plt.figure()
plt.plot(model.history.history['loss'],'b',label='Training loss')
plt.plot(model.history.history['val_loss'],'r',label='Validation val_loss')
plt.title('Traing and Validation loss')
plt.legend()
def model_metrics(model, x, y):
"""
评估指标
"""
yhat = model.predict(x).round() # 模型预测yhat,预测阈值按默认0.5划分
result = {
'f1_score': f1_score(y, yhat),
'precision':precision_score(y, yhat),
'recall':recall_score(y, yhat)
}
return result
# 模型评估结果
print("TRAIN")
print(model_metrics(model, x_train, y_train))
print("TEST")
print(model_metrics(model, x_test, y_test))
- EOF -
关注「大数据与机器学习文摘」
看精选技术文章和最新行业资讯
点赞和在看就是最大的支持❤️